package com.pactera.jep.service.sys.util;

import com.pactera.jep.core.exception.ServiceException;
import com.pactera.jep.core.security.SecurityException;
import org.springframework.util.Base64Utils;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * DES加密介绍
 * DES是一种对称加密算法，所谓对称加密算法即：加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究，
 * 后来被美国政府正式采用，之后开始广泛流传，但是近些年使用越来越少，因为DES使用56位密钥，以现代计算能力，
 * 24小时内即可被破解。虽然如此，在某些简单应用中，我们还是可以使用DES加密算法，本文简单讲解DES的JAVA实现
 * 。
 * 注意：DES加密和解密过程中，密钥长度都必须是8的倍数
 */
public class AESEncoder {
    private static final String DEFAULT_SECRET_KEY = "ylvY8oNpcoJjwSkS";
    private static final String ALGORITHM_ASE = "AES";
    private static final String AES_MODE_PADDING = "AES/ECB/PKCS5Padding";


    public static String encrypt(String password) {
        return encrypt(password, DEFAULT_SECRET_KEY);
    }

    public static String decrypt(String content) {
        return decrypt(content, DEFAULT_SECRET_KEY);
    }

    /**
     * 加密
     *
     * @param password 密码
     * @return secretKey 秘钥
     */
    public static String encrypt(String password, String secretKey) {
        try {
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM_ASE);
            Cipher cipher = Cipher.getInstance(AES_MODE_PADDING);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(password.getBytes());
            return Base64Utils.encodeToString(result);
        } catch (Throwable e) {
            throw new SecurityException("AES加密失败");
        }
    }

    /**
     * 解密
     *
     * @param content   密文
     * @param secretKey 秘钥
     */
    public static String decrypt(String content, String secretKey) {
        try {
            content = content.replaceAll(" ","+");
//            content = content.replaceAll(" ","");
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), ALGORITHM_ASE);
            Cipher cipher = Cipher.getInstance(AES_MODE_PADDING);
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(Base64Utils.decode(content.getBytes()));
            return new String(result);
        } catch (Exception e) {
            e.printStackTrace();
            throw new SecurityException("AES解密失败");
        }
    }


}
